import axios from 'axios'
import store from '@/store/index'
import router from '@/router'
import { Message } from 'element-ui'
// import { reject } from 'core-js/fn/promise'
// import { config } from 'vue/types/umd'
export const baseURL = 'http://big-event-vue-api-t.itheima.net' // 接口和文档所在的地址
// 创建一个自定义的axios
// myAxios请求的时候地址=baseURL+url
const myAxios = axios.create({
  baseURL: baseURL
})
// console.log(myAxios)

// 定义请求拦截器
// axios里每次调用request都会先走这个请求拦截器
myAxios.interceptors.request.use(function (config) {
  // 在请求前触发一次 这个return 交给axios源码内,根据配置项发起请求
  // config 他返回给axios源码 config配置对象(请求后台的参数都在这个对象上)
  // 发起请求时,统一携带请求头
  // 登录和注册时,vuex无token,其他页面有token
  if (store.state.token) {
    config.headers.Authorization = store.state.token
  }
  // console.log(config)
  return config
}, function (error) {
  // 请求发起前的代码如果有异常，会直接进入这里，相当于trycatch
  // 返回一个拒绝状态的promise对象 （axios留在原地的promise对象状态就为失败结果为error变量值）
  // 此函数类似catch函数里的return
  // 口诀：return非pormise对象值，会作为成功的结果，返回给下一个promise对象
  // 口诀 return一个promise对象,这个promise对象状态,返回给下一个promise对象
  // Promise.reject()原地留下一个新的promise对象 状态为失败
  return Promise.reject(error)
  // Promise.reject(error)等同于
  // return new Promise((resolve,reject)=>{
  //   reject(error)
  // })
})

// 定义响应拦截器
myAxios.interceptors.response.use(function (response) {
  // 响应http状态码为2xx或3xx时触发成功的回调,形参中response是成功的结果

  return response
}, function (error) {
  // 响应http状态码为4xx或5xx触发失败的回调.error是失败的结果
  if (error.response.status === 401) {
    // 本次token过期,此时到清除token,返回登录页面 清除vuex的所有东西
    // 手动让token过期就是破坏localstorage里面的值然后刷新页面
    store.commit('updateToken', '')
    store.commit('updateUserInfo', {})
    router.push('/login')
    Message.error('用户身份已过期')
  }
  return Promise.reject(error)
})

// 导出自定义的axios方法，供外部调用发请求
export default myAxios
